Точная нарезка материала

Эту задачу описали на форуме owen.ru.

Процитирую:

  1. На валу двигателя транспорта подачи материала установлен энкодер с разрешением 500 имп/об
  2. Частота вращения двигателя - максимум 3000 об/мин (обычно 2000 об/мин)
  3. Двигатель работает от частотника
  4. Время, достаточное для подачи нужного количества материала ~0.4-0.6 сек за цикл
  5. Энкодер подключен к счетчику, который управляет частотником двигателя
  6. Двигатель низкоинерционный, остальная механика транспорта тоже. Останов происходит практически мгновенно, переезды есть, но они не критичны и их можно попытаться компенсировать программно.

От данного счетчика требуется отсчитать нужное количество импульсов и остановить двигатель. В следующем цикле счетчик должен быть обнулен до старта двигателя (переменная total в Вашем примере).

Т.е. счетчик должен уверенно и без пропусков считывать от одной фазы энкодера сигнал частотой до 30 кГц.

Если у вас открыта среда Hardella IDE, то можете либо открыть код примера в среде, либо создать свой проект на основе примера (File > New > Project > Material cutter).

Решение

Создадим тип-перечисление для того, чтобы описывать текущее состояние системы (это делается правой кнопкой, New > c.g.v.iec66131.types > type alias):

Enum для состояния

Опишем нужную логику на языке ST:

Логика нарезчика

Здесь более-менее прозрачно: выполняем то или иное действие в зависимости от текущего состояния.

Если движение закончено (текущее состояние STOP), то ждём пропадания enable для запуска нового движения.

В начальном состоянии INIT ждём когда установится нужная длина (runLength) и придёт сигнал на запуск (enable)

При движении считаем общий пробег в переменной offset и останавливаемся, если нужная длина пройдена.

Программа для PRU

В PRU программе всго 3 строки:

  1. В первой вызывается блок ABZ энкодера для вычисления его положения
  2. Во второй строке вызываем блок нарезчика. В качестве параметра cntr передаётся значение счётчика импульсов на 4-ом входе.
  3. Сигнал на включение мотора (cutter.out) выдаётся на 3-ый выход (out3).

Обновлено:

Комментировать